#!/usr/bin/python3
# @Time    : 2024-03-16 下午 12:14
# @Author  : MingYangHe
# @Email   : 1780040868@qq.com
from typing import List
import bisect

"""给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续
子数组[numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。

示例 1：
输入：target = 7, nums = [2,3,1,2,4,3]
输出：2
解释：子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2：
输入：target = 4, nums = [1,4,4]
解释：子数组 [4] 是该条件下的长度最小的子数组。
输出：1

示例 3：
输入：target = 11, nums = [1,1,1,1,1,1,1,1]
解释：无
输出：0"""

"""思路：
只用一个for循环，那么这个循环的索引，一定是表示 滑动窗口的终止位置
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组
窗口的起始位置如何移动：如果当前窗口的值大于s了，窗口就要向前移动了（也就是该缩小了）。
窗口的结束位置如何移动：窗口的结束位置就是遍历数组的指针，也就是for循环里的索引。
"""


class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]):
        """O(n)"""
        left = 0
        right = 0
        min_len = float('inf')
        cur_sum = 0  # 当前的累加值
        while right < len(nums):
            cur_sum += nums[right]
            while cur_sum >= target:
                sub_length = right - left + 1
                min_len = min(min_len, sub_length)
                cur_sum -= nums[left]
                left += 1
            right += 1
        return min_len if min_len != float('inf') else 0


if __name__ == '__main__':
    sou = Solution()
    target = 7
    nums = [2, 3, 1, 2, 4, 3]

    print(sou.minSubArrayLen(target, nums))

